﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Collections;
using System.Runtime.Serialization;


namespace Civilisation_code.PRessource
{
    /// <summary>
    /// Classe Fabrique_Ressource
    /// </summary>
    /// <remarks>
    /// Fabrique dans le patron de conception Poids-Mouche
    /// Singleton
    /// </remarks>
    [Serializable]
    public class Fabrique_Ressource : ISerializable
    {
        /// <summary>
        /// Création du singleton
        /// </summary>
        public static readonly Fabrique_Ressource FABRIQUE_RESSOURCE= new Fabrique_Ressource();

        /// <summary>
        /// Hashtable de toutes les ressources déjà existantes
        /// </summary>
        private Hashtable instances;

        /// <summary>
        /// Constructeur
        /// </summary>
        private Fabrique_Ressource()
        {
            //Initialisation
            instances = new Hashtable();
        }

        /// <summary>
        /// Obtenir la ressource d'un type donné en paramètre avec un bonus
        /// </summary>
        /// <param name="nom_ressource">Nom de la ressource</param>
        /// <param name="bonus">Nom du bonus</param>
        /// <returns>Ressource correspondante</returns>
        public Ressource obtenirRessource(string nom_ressource, string bonus="")
        {
            //Si la ressource (bonus+type) n'est pas déjà créée
            if(!instances.ContainsKey(nom_ressource+bonus)){
                //Si la ressource (type) n'est pas déjà créée
                if(!instances.ContainsKey(nom_ressource)){
                    //On la crée
                    creationRessource(nom_ressource);
                }
                //S'il y a un bonus
                if(!bonus.Equals(""))
                    switch(bonus)
                    {
                        case "Fruit": 
                            //On crée la ressource avec la ressource du type déjà créée
                            instances.Add(nom_ressource+bonus,new Fruit((Ressource)instances[nom_ressource]));
                            break;
                        case "Fer" :
                            //On crée la ressource avec la ressource du type déjà créée
                            instances.Add(nom_ressource + bonus, new Fer((Ressource)instances[nom_ressource]));
                            break;      
                    }
            }
            return (Ressource)instances[nom_ressource + bonus];
        }

        /// <summary>
        /// Création d'une ressource (Montagne, Désert ou Plaine)
        /// </summary>
        /// <param name="nom_ressource">Type de la ressource</param>
        void creationRessource(string nom_ressource)
        {
            switch (nom_ressource)
            {
                case "Montagne" :
                    instances.Add(nom_ressource,new Montagne());
                    break;
                case "Plaine":
                    instances.Add(nom_ressource, new Plaine());
                    break;
                case "Desert":
                    instances.Add(nom_ressource, new Desert());
                    break;
            }
        }

        void ISerializable.GetObjectData(SerializationInfo info, StreamingContext context)
        {
        }
            Fabrique_Ressource(SerializationInfo info,StreamingContext context)
            {
            }
   }
}
